﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Globalization;

namespace UOL.PagSeguro {
    public class RetornoVenda {

        private string _emailVendedor;
        private string _codigoTransacao;
        private string _codigoReferencia;
        private TipoFreteRetorno _tipoFrete;
        private double _extras;
        private double _valorFrete;
        private string _anotacao;
        private DateTime _data;
        private TipoPagamento _tipoPagamento;
        private StatusTransacao _statusTransacao;
        private Cliente _cliente;
        private List<Produto> _produtos;
        private int _parcelas;

        #region Propriedades
        public string EmailVendedor {
            get { return _emailVendedor; }
            set { _emailVendedor = value; }
        }

        /// <summary>
        /// Código da transação retornada pelo PagSeguro.
        /// Este campo informa o código da transação gerada no PagSeguro após a conclusão do pagamento.
        /// </summary>
        public string CodigoTransacao {
            get { return _codigoTransacao; }
            set { _codigoTransacao = value; }
        }

        public string CodigoReferencia {
            get { return _codigoReferencia; }
            set { _codigoReferencia = value; }
        }

        public TipoFreteRetorno TipoFrete {
            get { return _tipoFrete; }
            set { _tipoFrete = value; }
        }

        public double Extras {
            get { return _extras; }
            set { _extras = value; }
        }

        public string TipoFreteDescricao {
            get {
                string tipo_frete = string.Empty;
                switch (this.TipoFrete) {
                    case TipoFreteRetorno.Sedex:
                        tipo_frete = "Sedex";
                        break;
                    case TipoFreteRetorno.PAC:
                        tipo_frete = "Encomenda PAC";
                        break;
                    default:
                        tipo_frete = "Não Informado";
                        break;
                }
                return tipo_frete;
            }
        }

        public double ValorFrete {
            get { return _valorFrete; }
            set { _valorFrete = value; }
        }

        public string Anotacao {
            get { return _anotacao; }
            set { _anotacao = value; }
        }

        public DateTime Data {
            get { return _data; }
            set { _data = value; }
        }

        public TipoPagamento TipoPagamento {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public string TipoPagamentoDescricao {
            get {
                string forma_pagamento = string.Empty;
                switch (this.TipoPagamento) {
                    case UOL.PagSeguro.TipoPagamento.Boleto:
                        forma_pagamento = "Boleto Bancário";
                        break;
                    case UOL.PagSeguro.TipoPagamento.CartaoCredito:
                        forma_pagamento = "Cartão de Crédito";
                        break;
                    case UOL.PagSeguro.TipoPagamento.PagSeguro:
                        forma_pagamento = "Transferência de Crédito PagSeguro";
                        break;
                    case UOL.PagSeguro.TipoPagamento.TransferenciaOnline:
                        forma_pagamento = "Transferência Online";
                        break;
                    default:
                        forma_pagamento = "Não informada";
                        break;
                }
                return forma_pagamento;
            }
        }

        public StatusTransacao StatusTransacao {
            get { return _statusTransacao; }
            set { _statusTransacao = value; }
        }

        public string StatusTransacaoDescricao {
            get {
                string status = string.Empty;
                switch (this.StatusTransacao) {
                    case UOL.PagSeguro.StatusTransacao.AguardandoPagamento:
                        status = "Aguardando Pagamento";
                        break;
                    case UOL.PagSeguro.StatusTransacao.Aprovada:
                        status = "Pagamento Aprovado";
                        break;
                    case UOL.PagSeguro.StatusTransacao.Cancelada:
                        status = "Pagamento Cancelado";
                        break;
                    case UOL.PagSeguro.StatusTransacao.Completa:
                        status = "Pagamento Completo";
                        break;
                    case UOL.PagSeguro.StatusTransacao.EmAnalise:
                        status = "Pagamento em análise";
                        break;
                    default:
                        status = "Não informado";
                        break;
                }
                return status;
            }
        }

        public Cliente Cliente {
            get { return _cliente; }
            set { _cliente = value; }
        }

        public List<Produto> Produtos {
            get { return _produtos; }
            set { _produtos = value; }
        }

        public int Parcelas {
            get { return _parcelas; }
            set { _parcelas = value; }
        }
        #endregion

        public RetornoVenda() {

        }

        internal static RetornoVenda CriarViaRespostaNPI(NameValueCollection nvc) {
            RetornoVenda retorno = new RetornoVenda();

            //Pagamento
            retorno.EmailVendedor = nvc["VendedorEmail"];
            retorno.CodigoTransacao = nvc["TransacaoID"];
            retorno.CodigoReferencia = nvc["Referencia"];
            switch (nvc["TipoFrete"]) {
                case "SD":
                    retorno.TipoFrete = TipoFreteRetorno.Sedex;
                    break;
                case "EN":
                    retorno.TipoFrete = TipoFreteRetorno.PAC;
                    break;
                default:
                    retorno.TipoFrete = TipoFreteRetorno.PAC;
                    break;
            }
            retorno.Extras = Convert.ToDouble(nvc["Extras"], CultureInfo.GetCultureInfo("pt-BR"));
            retorno.ValorFrete = Convert.ToDouble(nvc["ValorFrete"], CultureInfo.GetCultureInfo("pt-BR"));
            retorno.Anotacao = nvc["Anotacao"];
            retorno.Data = DateTime.ParseExact(nvc["DataTransacao"], "dd/MM/yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pt-BR"));
            retorno.ValorFrete = Convert.ToDouble(nvc["ValorFrete"], CultureInfo.GetCultureInfo("pt-BR"));
            retorno.Parcelas = Convert.ToInt32(nvc["Parcelas"], CultureInfo.GetCultureInfo("pt-BR"));

            if (nvc["TipoPagamento"].ToLower().Equals("pagamento")) {
                retorno.TipoPagamento = TipoPagamento.PagSeguro;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("cart")) {
                retorno.TipoPagamento = TipoPagamento.CartaoCredito;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("bole")) {
                retorno.TipoPagamento = TipoPagamento.Boleto;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("paga")) {
                retorno.TipoPagamento = TipoPagamento.TransferenciaOnline;
            }

            if (nvc["StatusTransacao"].ToLower().Equals("completo")) {
                retorno.StatusTransacao = StatusTransacao.Completa;
            } else if (nvc["StatusTransacao"].ToLower().StartsWith("agua")) {
                retorno.StatusTransacao = StatusTransacao.AguardandoPagamento;
            } else if (nvc["StatusTransacao"].ToLower().StartsWith("apro")) {
                retorno.StatusTransacao = StatusTransacao.Aprovada;
            } else if (nvc["StatusTransacao"].ToLower().StartsWith("em a")) {
                retorno.StatusTransacao = StatusTransacao.EmAnalise;
            } else if (nvc["StatusTransacao"].ToLower().StartsWith("canc")) {
                retorno.StatusTransacao = StatusTransacao.Cancelada;
            }

            //Cliente
            retorno.Cliente = new Cliente();
            retorno.Cliente.Nome = nvc["CliNome"];
            retorno.Cliente.Email = nvc["CliEmail"];
            retorno.Cliente.Endereco = nvc["CliEndereco"];
            retorno.Cliente.Numero = nvc["CliNumero"];
            retorno.Cliente.ComplementoEndereco = nvc["CliComplemento"];
            retorno.Cliente.Bairro = nvc["CliBairro"];
            retorno.Cliente.Cidade = nvc["CliCidade"];
            retorno.Cliente.Uf = nvc["CliEstado"];
            retorno.Cliente.Cep = nvc["CliCEP"];

            string telefone = nvc["CliTelefone"].Trim();
            if (telefone.Length > 0 && telefone.Split(' ').Length > 1) {
                int ddd = 0;
                int.TryParse(telefone.Split(' ')[0], out ddd);
                retorno.Cliente.DDD = ddd;

                int tel = 0;
                int.TryParse(telefone.Split(' ')[1], out tel);
                retorno.Cliente.Telefone = tel;
            }

            //Produtos
            retorno.Produtos = new List<Produto>();
            for (int i = 1; i <= int.Parse(nvc["NumItens"]); i++) {
                Produto produto = new Produto();
                produto.Codigo = nvc["ProdID_" + i];
                produto.Descricao = nvc["ProdDescricao_" + i];
                produto.Valor = Convert.ToDouble(nvc["ProdValor_" + i], CultureInfo.GetCultureInfo("pt-BR"));
                produto.Quantidade = int.Parse(nvc["ProdQuantidade_" + i]);
                produto.Frete = Convert.ToDouble(nvc["ProdFrete_" + i], CultureInfo.GetCultureInfo("pt-BR"));
                retorno.Produtos.Add(produto);
            }

            return retorno;
        }
    }

    public enum TipoFreteRetorno {
        Sedex = 0,
        PAC = 1
    }

    public enum TipoPagamento {
        Boleto = 0,
        CartaoCredito = 1,
        PagSeguro = 2,
        TransferenciaOnline = 3
    }

    public enum StatusTransacao {
        AguardandoPagamento = 0,
        Aprovada = 1,
        Cancelada = 2,
        Completa = 3,
        EmAnalise = 4
    }

}
